Fix a problem with screen changes and csd
authorMatthias Clasen <mclasen@redhat.com>
Fri, 24 Oct 2014 17:30:19 +0000 (13:30 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 24 Oct 2014 19:57:33 +0000 (15:57 -0400)
When a new screen is set on a window, we unrealize it, to
recreate all the resources. But we don't reset the client_decorated
flag, so realize() doesn't call create_decoration() - which makes
sense, since the decoration already exists. But the side-effect
of create_decoration() is to select the rgba visual, and visuals
are per-screen.

Fix this by looking for the rgba visual in set_screen(), and
replacing it with the rgba visual for the new screen, if necessary.

gtk/gtkwindow.c

index 23285914828e324f974926d01767400fd2a0638f..11a22200e10ecc60bf2c5ac3ac181b6c1c480c4a 100644 (file)
@@ -10291,6 +10291,7 @@ gtk_window_set_screen (GtkWindow *window,
   GtkWindowPrivate *priv;
   GtkWidget *widget;
   GdkScreen *previous_screen;
+  gboolean was_rgba;
   gboolean was_mapped;
 
   g_return_if_fail (GTK_IS_WINDOW (window));
@@ -10304,6 +10305,12 @@ gtk_window_set_screen (GtkWindow *window,
   widget = GTK_WIDGET (window);
 
   previous_screen = priv->screen;
+
+  if (gdk_screen_get_rgba_visual (previous_screen) == gtk_widget_get_visual (widget))
+    was_rgba = TRUE;
+  else
+    was_rgba = FALSE;
+
   was_mapped = gtk_widget_get_mapped (widget);
 
   if (was_mapped)
@@ -10337,6 +10344,15 @@ gtk_window_set_screen (GtkWindow *window,
     }
   g_object_notify (G_OBJECT (window), "screen");
 
+  if (was_rgba)
+    {
+      GdkVisual *visual;
+
+      visual = gdk_screen_get_rgba_visual (screen);
+      if (visual)
+        gtk_widget_set_visual (widget, visual);
+    }
+
   if (was_mapped)
     gtk_widget_map (widget);